#include "bgmcontrol.h"
#include "playhand.h"
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QRandomGenerator>
#include <QTimer>

BGMControl::BGMControl(QObject *parent) : QObject{parent}
{
    for (int i = 0; i < 5; ++ i) {
        QMediaPlayer* player = new QMediaPlayer(this);
        QMediaPlaylist* playlist = new QMediaPlaylist(this);
        if (i < 2 || i == 4) {
            // 设置播放对象的音乐的播放模式 只播放一次
            playlist->setPlaybackMode(QMediaPlaylist::CurrentItemOnce);
        } else if (i == 2) { // 背景音乐
            // 设置为循环播放
            playlist->setPlaybackMode(QMediaPlaylist::Loop);
        }
        // 设置音乐播放列表
        player->setPlaylist(playlist);
        // 设置播放音量
        player->setVolume(100);
        m_players.push_back(player);
        m_playlists.push_back(playlist);
    }

    initPlaylist();
}

// 初始化播放列表, 加载Json文件
void BGMControl::initPlaylist()
{
    QStringList list;
    list << "Man" << "Woman" << "BGM" << "Other" << "Ending";

    // 读取Json配置文件
    QFile file(":/conf/playList.json");
    if (!file.open(QFile::ReadOnly)) {
        return ;
    }
    QByteArray json = file.readAll();
    file.close();

    // 解析Json配置文件
    QJsonDocument doc = QJsonDocument::fromJson(json);
    QJsonObject obj = doc.object();
    for (int i = 0; i < list.size(); ++ i) {
        QString prefix = list.at(i);
        QJsonArray array = obj.value(prefix).toArray();
        for (int j = 0; j < array.size(); ++ j) {
            m_playlists[i]->addMedia(QMediaContent(QUrl(array.at(j).toString())));
        }
    }
}

// 播放背景音乐
void BGMControl::startBGM(int volume)
{
    m_playlists[2]->setCurrentIndex(0);
    m_players[2]->setVolume(volume);
    m_players[2]->play();
}

// 暂停背景音乐
void BGMControl::stopBGM()
{
    m_players[2]->stop();
}

// 2. 播放玩家抢地主的音乐
void BGMControl::playerRobLordMusic(int point, RoleSex sex, bool isFirst)
{

    /*
     * 玩家是男是女
     * 玩家是否下注
     * 玩家第几个下注
     * 什么时候播放什么音乐
     */
    // 玩家的性别
    int index = (sex == RoleSex::Man ? 0 : 1);
    // 玩家第一个叫地主
    if (isFirst && point > 0) {
        m_playlists[index]->setCurrentIndex(CardType::Order);
    } else if (point == 0) {
        // 玩家不抢地主
        if (isFirst) { // 玩家第一个不抢地主
            m_playlists[index]->setCurrentIndex(CardType::NoOrder);
        } else {
            m_playlists[index]->setCurrentIndex(CardType::NoRob);
        }
    }
    // 玩家抢地主
    else if (point == 2) {
        m_playlists[index]->setCurrentIndex(CardType::Rob1);
    } else if (point == 3) {
        m_playlists[index]->setCurrentIndex(CardType::Rob2);
    }
    m_players[index]->play(); // 开始播放
}

void BGMControl::playCardMusic(Cards cards, bool isFirst, RoleSex sex)
{
    // 获取玩家的性别与播放列表
    int index = (sex == RoleSex::Man ? 0 : 1) ;
    QMediaPlaylist* list = m_playlists[index];

    Card::CardPoint pt = Card::CardPoint::Card_Begin;
    // 取出牌型，进行判断播放哪一种音乐
    PlayHand hand(cards);
    PlayHand::HandType type = hand.getHandType();
    if (type == PlayHand::Hand_Single || type == PlayHand::Hand_Pair || type == PlayHand::Hand_Triple) {
        pt = cards.takeRandomCard().getPoint();
    }
    int number = 0; // 某个牌型对应的mp3音乐在播放列表中的位置
    switch(type)
    {
    // 单牌
    case PlayHand::Hand_Single:
        number = pt - 1;
        break;
    // 对牌
    case PlayHand::Hand_Pair:
        number = pt - 1 + 15;
        break;
    // 三张点数相同的牌
    case PlayHand::Hand_Triple:
        number = pt - 1 + 15 + 13;
        break;
    // 三带一
    case PlayHand::Hand_Triple_Single:
        number = CardType::ThreeBindOne;
        break;
    // 三带二
    case PlayHand::Hand_Triple_Pair:
        number = CardType::ThreeBindPair;
        break;
    // 飞机
    case PlayHand::Hand_Plane:
    // 飞机带两个单
    case PlayHand::Hand_Plane_Two_Single:
    // 飞机带两个对儿
    case PlayHand::Hand_Plane_Two_Pair:
        number = CardType::Plane;
        break;
    // 连对
    case PlayHand::Hand_Seq_Pair:
        number = CardType::SequencePair;
        break;
    // 顺子
    case PlayHand::Hand_Seq_Single:
        number = CardType::Sequence;
        break;
    // 炸弹
    case PlayHand::Hand_Bomb:
        number = CardType::Bomb;
        break;
    // 王炸
    case PlayHand::Hand_Bomb_Jokers:
        number = CardType::JokerBomb;
        break;
    // 炸弹带一对儿
    case PlayHand::Hand_Bomb_Pair:
    // 炸弹带两单
    case PlayHand::Hand_Bomb_Two_Single:
    // 王炸带一对儿
    // case PlayHand::Hand_Bomb_Jokers_Pair:
    // 王炸带两单
    // case PlayHand::Hand_Bomb_Jokers_Two_Single:
        number = CardType::FourBindTwo;

    default:
        break;
    }

    // 玩家并非第一个出牌
    if (!isFirst && (number >= CardType::Plane && number <= CardType::FourBindTwo)) {
        list->setCurrentIndex(CardType::MoreBiger1 + QRandomGenerator::global()->bounded(2));;
    } else {
        list->setCurrentIndex(number);
    }

    m_players[index]->play();
    // 播放辅助音乐
    if (number == CardType::Bomb || number == CardType::JokerBomb) {
        playAssistMusic(AssistMusic::BombVoice);
    } else if (number == CardType::Plane) {
        playAssistMusic(AssistMusic::PlaneVoice);
    }

}

// 播放最后还有一张或两张牌的背景音乐
void BGMControl::playLastMusic(CardType type, RoleSex sex)
{
    // 1. 玩家的性别
    int index = (sex == Man ? 0 : 1);
    // 2. 找到播放列表
    QMediaPlaylist* list = m_playlists[index];
    if (m_players[index]->state() == QMediaPlayer::StoppedState) {
        // 已经播放完了所出牌型的音乐，该播放提示音乐了
        list->setCurrentIndex(type);
        m_players[index]->play();
    } else {
        // 未播放完
        QTimer::singleShot(1500, this, [=]() {
            list->setCurrentIndex(type);
            m_players[index]->play();
        });
    }
}

// 播放不出牌的音乐
void BGMControl::playPassMusic(RoleSex sex)
{
    // 1. 判断玩家的性别
    int index = (sex == RoleSex::Man ? 0 : 1) ;
    // 2. 找到对应的播放列表
    QMediaPlaylist* list = m_playlists[index];
    // 3. 找到播放的音乐
    int random = QRandomGenerator::global()->bounded(4);
    list->setCurrentIndex(CardType::Pass1 + random);
    // 4. 播放音乐
    m_players[index]->play();
}

// 播放辅助音乐
void BGMControl::playAssistMusic(AssistMusic type)
{
    // 设置音乐播放模式
    QMediaPlaylist::PlaybackMode mode;
    if (type == Dispatch) {
        // 发牌音乐设置为循环播放模式
        mode = QMediaPlaylist::CurrentItemInLoop;
    } else {
        // 其它音乐设置为只播放一次
        mode = QMediaPlaylist::CurrentItemOnce;
    }
    // 2. 找到播放列表
    QMediaPlaylist* list = m_playlists[3];
    // 3. 找到播放的音乐
    list->setCurrentIndex(type);
    list->setPlaybackMode(mode);
    // 4. 播放音乐
    m_players[3]->play();
}

// 播放结尾音乐
void BGMControl::playEndingMusic(bool isWin)
{
    if (isWin) {
        m_playlists[4]->setCurrentIndex(0);
    } else {
        m_playlists[4]->setCurrentIndex(1);
    }
    m_players[4]->play();
}

// 暂停辅助音乐的播放
void BGMControl::stopAssistMusic()
{
    m_players[3]->stop();
}
